﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Routing;
using System.Web.Mvc;
using equinoxWeb.Models;
using equinoxWeb.GestionConexion;
using equinoxWeb.SearchObjects;
using FluentScheduler;

namespace equinoxWeb.Controllers
{
    public class CasoController : EquinoxController
    {
        //
        // GET: /Caso/

        public ActionResult Index()
        {
            if (defaultAction != null) return defaultAction;

            return RedirectToAction("MisCasos");
        }

        //
        // GET: /Caso/Details/5

        public ActionResult Details(int idCaso)
        {
            if (defaultAction != null) return defaultAction;
            Caso caso = CasoFunction.abrirCaso(idCaso);
            if (esCliente)
            {
                if (idClienteLogueado != caso.Cliente.Idcliente)
                    return View("~/Views/Shared/PermisoDenegado.cshtml");
            }
            return View(caso);
        }

        //
        // GET: /Caso/Create

        public ActionResult Create()
        {
            if (defaultAction != null) return defaultAction;
            if (esCliente)
                return View("~/Views/Shared/PermisoDenegado.cshtml");

            List<TipoCaso> tiposCaso = TipoCasoFunction.listarTipoCaso();
            List<Cliente> clientes = ClienteFunction.listarCliente();
            List<Usuario> usuarios = UsuarioFunction.listarUsuario();
            ViewBag.listaTipoCaso = tiposCaso;
            ViewBag.listaCliente = clientes;
            ViewBag.listaUsuario = usuarios;
            ViewBag.listaAnhos = GestorConexion.GetListaAnhos(5);
            return View();
        }

        //
        // POST: /Caso/Create

        [HttpPost]
        public ActionResult Create(Caso caso)
        {
            try
            {
                if (defaultAction != null) return defaultAction;
                if (esCliente)
                    return View("~/Views/Shared/PermisoDenegado.cshtml");

                if (CasoFunction.existeCodigo(caso.NReferencia))
                {
                    ViewBag.error = "El numero de referencia ya existe";
                    List<TipoCaso> tiposCaso = TipoCasoFunction.listarTipoCaso();
                    List<Cliente> clientes = ClienteFunction.listarCliente();
                    List<Usuario> usuarios = UsuarioFunction.listarUsuario();
                    ViewBag.listaTipoCaso = tiposCaso;
                    ViewBag.listaCliente = clientes;
                    ViewBag.listaUsuario = usuarios;
                    ViewBag.listaAnhos = GestorConexion.GetListaAnhos(5);
                    return View(caso);
                }

                caso.Correoenviado = 0;
                CasoFunction.agregarCaso(caso);
                RouteValueDictionary routeValues = new RouteValueDictionary();
                routeValues.Add("idCaso", caso.IdCaso);
                MailController mailContrl = new MailController();
                List<String> correos = mailContrl.loadParameters();
                string asunto = "Caso creado";
                string cuerpo = "Se acaba de crear el caso " + CasoFunction.obtenerReferencia(caso.IdCaso) + " , con contenido: " + caso.Content + "\n";
                cuerpo += "Se le notificara un dia despues de la fecha de nominacion.\n";
                foreach (String correo in correos)
                {
                    MailController.SendEmail(correo, asunto, cuerpo);
                }

                return RedirectToAction("Details", routeValues);
            }
            catch (Exception ex)
            {
                ViewBag.error = mensajeError == null || mensajeError == "" ? ex.Message : mensajeError;
                defaultAction = View("~/Views/Shared/Error.cshtml");
                return defaultAction;
            }
        }

        //
        // GET: /Caso/Edit/5

        public ActionResult Edit(int idCaso)
        {
            if (defaultAction != null) return defaultAction;
            if (esCliente)
                return View("~/Views/Shared/PermisoDenegado.cshtml");

            List<TipoCaso> tiposCaso = TipoCasoFunction.listarTipoCaso();
            List<Cliente> clientes = ClienteFunction.listarCliente();
            List<Usuario> usuarios = UsuarioFunction.listarUsuario();
            ViewBag.listaTipoCaso = tiposCaso;
            ViewBag.listaCliente = clientes;
            ViewBag.listaUsuario = usuarios;
            Caso caso = CasoFunction.abrirCaso(idCaso);
            ViewBag.listaAnhos = GestorConexion.GetListaAnhos(5);
            return View(caso);
        }

        //
        // POST: /Caso/Edit/5

        [HttpPost]
        public ActionResult Edit(Caso caso)
        {
            if (defaultAction != null) return defaultAction;
            if (esCliente)
                return View("~/Views/Shared/PermisoDenegado.cshtml");

            if (CasoFunction.existeCodigo(caso.NReferencia,caso.IdCaso))
            {
                ViewBag.error = "El numero de referencia ya existe";
                List<TipoCaso> tiposCaso = TipoCasoFunction.listarTipoCaso();
                List<Cliente> clientes = ClienteFunction.listarCliente();
                List<Usuario> usuarios = UsuarioFunction.listarUsuario();
                ViewBag.listaTipoCaso = tiposCaso;
                ViewBag.listaCliente = clientes;
                ViewBag.listaUsuario = usuarios;
                ViewBag.listaAnhos = GestorConexion.GetListaAnhos(5);
                return View(caso);
            }
            try
            {
                CasoFunction.modificarCaso(caso);
                RouteValueDictionary routeValues = new RouteValueDictionary();
                routeValues.Add("idCaso", caso.IdCaso);
                CasoFunction.marcarComoNotificado(caso.IdCaso, 0);
                return RedirectToAction("Details", routeValues);
            }
            catch
            {
                List<TipoCaso> tiposCaso = TipoCasoFunction.listarTipoCaso();
                List<Cliente> clientes = ClienteFunction.listarCliente();
                List<Usuario> usuarios = UsuarioFunction.listarUsuario();
                ViewBag.listaTipoCaso = tiposCaso;
                ViewBag.listaCliente = clientes;
                ViewBag.listaUsuario = usuarios;
                ViewBag.listaAnhos = GestorConexion.GetListaAnhos(5);
                return View(caso);
            }
        }

        //
        // GET: /Caso/Delete/5

        public ActionResult Delete(int id)
        {
            if (defaultAction != null) return defaultAction;
            if (esCliente)
                return View("~/Views/Shared/PermisoDenegado.cshtml");

            return View();
        }

        //
        // POST: /Caso/Delete/5

        [HttpPost]
        public ActionResult Delete(int id, FormCollection collection)
        {
            if (defaultAction != null) return defaultAction;
            if (esCliente)
                return View("~/Views/Shared/PermisoDenegado.cshtml");

            try
            {
                // TODO: Add delete logic here

                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }

        [HttpPost]
        public ActionResult Cerrar(int idCaso)
        {
            if (defaultAction != null) return defaultAction;
            if (esCliente)
                return View("~/Views/Shared/PermisoDenegado.cshtml");

            CasoFunction.cerrarCaso(idCaso);
            RouteValueDictionary routeValues = new RouteValueDictionary();
            routeValues.Add("idCaso", idCaso);
            return RedirectToAction("Details", routeValues);
        }

        public ActionResult Search()
        {
            if (defaultAction != null) return defaultAction;

            List<TipoCaso> tiposCaso = TipoCasoFunction.listarTipoCaso();
            List<Cliente> clientes;
            if (esCliente)
            {
                clientes = new List<Cliente>();
                clientes.Add(ClienteFunction.abrirCliente(idClienteLogueado));
            }
            else
            {
                clientes = ClienteFunction.listarCliente();
            }
            List<Usuario> usuarios = UsuarioFunction.listarUsuario();
            List<EstadoCaso> estadosCaso = EstadoCasoFunction.listarEstadoCaso();
            ViewBag.listaEstadoCaso = estadosCaso;
            ViewBag.listaTipoCaso = tiposCaso;
            ViewBag.listaCliente = clientes;
            ViewBag.listaUsuario = usuarios;
            return View();
        }

        public ActionResult SearchResults()
        {
            if (defaultAction != null) return defaultAction;

            List<Caso> casoResults = CasoFunction.buscarCaso(new CasoBusqueda());
            if (esCliente)
            {
                foreach (Caso caso in casoResults)
                {
                    if (caso.Cliente.Idcliente != idClienteLogueado)
                        casoResults.Remove(caso);
                }
            }

            ViewBag.casoResults = casoResults;
            return View();
        }

        public ActionResult MisCasos()
        {
            try
            {
                if (defaultAction != null) return defaultAction;
                Usuario user = CuentaController.getUsuario(this.HttpContext);

                CasoBusqueda casoBusqueda = new CasoBusqueda();
                casoBusqueda.IdestadoCaso = Constantes.EstadoAbierto;
                if (esCliente)
                    casoBusqueda.Idcliente = idClienteLogueado;
                else
                    casoBusqueda.Idusuario = user.IdUsuario;
                List<Caso> casoResults = CasoFunction.buscarCaso(casoBusqueda);
                ViewBag.casoResults = casoResults;
                return View();
            }
            catch (Exception ex)
            {
                ViewBag.error = mensajeError == null || mensajeError == "" ? ex.Message : mensajeError;
                defaultAction = View("~/Views/Shared/Error.cshtml");
                return defaultAction;
            }

        }

        [HttpPost]
        public ActionResult SearchResults(CasoBusqueda casoParam)
        {
            if (defaultAction != null) return defaultAction;
            if (esCliente)
            {
                casoParam.Idcliente = idClienteLogueado;
            }
            List<Caso> casoResults = CasoFunction.buscarCaso(casoParam);
            if (esCliente)
            {
                foreach (Caso caso in casoResults)
                {
                    if (caso.Cliente.Idcliente != idClienteLogueado)
                        casoResults.Remove(caso);
                }
            }
            ViewBag.casoResults = casoResults;
            return View();
        }

        public ActionResult AddCostDocument(int idCaso)
        {
            if (defaultAction != null) return defaultAction;
            if (esCliente)
                return View("~/Views/Shared/PermisoDenegado.cshtml");

            @ViewBag.listaMoneda = MonedaFunction.listarMoneda();
            @ViewBag.idCaso = idCaso;
            return View();
        }

        [HttpPost]
        public ActionResult AddCostDocument(Facturacion facturacion, String[] fecha, String[] horaDesde, String[] horaHasta,
            float[] nHoras, String[] descripcion, String[] surveyor, float[] subtotal, int[] tipoCosto)
        {
            if (defaultAction != null) return defaultAction;
            if (esCliente)
                return View("~/Views/Shared/PermisoDenegado.cshtml");

            try
            {
                facturacion.DetallesFacturacion = FacturacionFunction.crearListaDetalles(fecha, horaDesde, horaHasta, nHoras, descripcion, surveyor, subtotal, tipoCosto);
                FacturacionFunction.agregarFacturacion(facturacion, true);
                RouteValueDictionary routeValues = new RouteValueDictionary();
                routeValues.Add("idCaso", facturacion.IdCaso);
                routeValues.Add("idFacturacion", facturacion.IdFacturacion);
                return RedirectToAction("CostDetails", routeValues);
            }
            catch (Exception ex)
            {
                @ViewBag.listaMoneda = MonedaFunction.listarMoneda();
                @ViewBag.idCaso = facturacion.IdCaso;
                return View(facturacion);
            }
        }

        public ActionResult CostDetails(int idCaso, int idFacturacion)
        {
            if (defaultAction != null) return defaultAction;
            Caso caso = CasoFunction.abrirCaso(idCaso);
            if (esCliente)
            {
                if (idClienteLogueado != caso.Cliente.Idcliente)
                    return View("~/Views/Shared/PermisoDenegado.cshtml");
            }

            @ViewBag.listaMoneda = MonedaFunction.listarMoneda();
            Facturacion facturacion = FacturacionFunction.abrirFacturacion(idCaso, idFacturacion);
            return View(facturacion);
        }

        public ActionResult ListCostDocuments(int idCaso)
        {
            if (defaultAction != null) return defaultAction;
            Caso caso = CasoFunction.abrirCaso(idCaso);
            if (esCliente)
            {
                if (idClienteLogueado != caso.Cliente.Idcliente)
                    return View("~/Views/Shared/PermisoDenegado.cshtml");
            }

            @ViewBag.idCaso = idCaso;
            @ViewBag.listaFacturacion = FacturacionFunction.listaFacturacion(idCaso);
            return View();
        }

        public ActionResult EditCostDocument(int idFacturacion, int idCaso)
        {
            if (defaultAction != null) return defaultAction;
            if (esCliente)
                return View("~/Views/Shared/PermisoDenegado.cshtml");

            Facturacion facturacion = FacturacionFunction.abrirFacturacion(idCaso, idFacturacion);
            @ViewBag.listaMoneda = MonedaFunction.listarMoneda();
            @ViewBag.idCaso = idCaso;
            return View(facturacion);
        }

        [HttpPost]
        public ActionResult EditCostDocument(Facturacion facturacion, String[] fecha, String[] horaDesde, String[] horaHasta,
            float[] nHoras, String[] descripcion, String[] surveyor, float[] subtotal, int[] tipoCosto)
        {
            if (defaultAction != null) return defaultAction;
            if (esCliente)
                return View("~/Views/Shared/PermisoDenegado.cshtml");

            try
            {
                facturacion.DetallesFacturacion = FacturacionFunction.crearListaDetalles(fecha, horaDesde, horaHasta, nHoras, descripcion, surveyor, subtotal, tipoCosto);
                FacturacionFunction.agregarFacturacion(facturacion, false);
                RouteValueDictionary routeValues = new RouteValueDictionary();
                @ViewBag.listaMoneda = MonedaFunction.listarMoneda();
                routeValues.Add("idCaso", facturacion.IdCaso);
                routeValues.Add("idFacturacion", facturacion.IdFacturacion);
                return RedirectToAction("CostDetails", routeValues);
            }
            catch (Exception ex)
            {
                facturacion = FacturacionFunction.abrirFacturacion(facturacion.IdCaso, facturacion.IdFacturacion);
                @ViewBag.listaMoneda = MonedaFunction.listarMoneda();
                @ViewBag.idCaso = facturacion.IdCaso;
                return View(facturacion);
            }
        }

    }
}
